package cn.stimd.spring.aop;

/**
 * TargetSource持有AOP调用的目标对象，比如通过反射来调用，前提是环绕通知没有中断拦截器链的既有流程
 * 这是AOP框架的内部接口，开发者不应直接使用它
 * <p>
 * Created by Stimd
 * 项目地址：https://gitee.com/stimd/spring-wheel
 * 公众号：Java编程探微
 */
public interface TargetSource {
    /**
     * 获取目标对象的类型
     */
    Class<?> getTargetClass();

    /**
     * 获取目标对象，如果是静态的，总是返回同一个对象
     */
    Object getTarget() throws Exception;

    /**
     * 调用getTarget方法是否返回同一个对象
     * 如果为ture表示目标对象是动态的，支持池化、热交换等功能
     */
    boolean isStatic();


    /**
     * 如果支持池化，需要调用releaseTarget将目标对象归还给缓存池
     */
    void releaseTarget(Object target) throws Exception;
}
